package com.yeskery.nut.util;

/**
 * 类型的工具类
 * @author sprout
 * 2025-03-25 10:13
 * @version 1.0
 */
public class TypeUtils {

    /**
     * 检查两个类型是否兼容（支持基本类型和包装类型的兼容性）
     *
     * @param type1 第一个类型
     * @param type2 第二个类型
     * @return 如果兼容则返回 true，否则返回 false
     */
    public static boolean isAssignable(Class<?> type1, Class<?> type2) {
        if (type1.equals(type2)) {
            return true;
        }
        if (type1.isPrimitive()) {
            Class<?> wrapperType = getWrapperType(type1);
            return wrapperType != null && wrapperType.equals(type2);
        } else if (type2.isPrimitive()) {
            Class<?> wrapperType = getWrapperType(type2);
            return wrapperType != null && wrapperType.equals(type1);
        }
        return false;
    }

    /**
     * 获取基本类型对应的包装类型
     *
     * @param primitiveType 基本类型
     * @return 包装类型，如果输入不是基本类型则返回 null
     */
    private static Class<?> getWrapperType(Class<?> primitiveType) {
        if (boolean.class.equals(primitiveType)) {
            return Boolean.class;
        } else if (byte.class.equals(primitiveType)) {
            return Byte.class;
        } else if (char.class.equals(primitiveType)) {
            return Character.class;
        } else if (short.class.equals(primitiveType)) {
            return Short.class;
        } else if (int.class.equals(primitiveType)) {
            return Integer.class;
        } else if (long.class.equals(primitiveType)) {
            return Long.class;
        } else if (float.class.equals(primitiveType)) {
            return Float.class;
        } else if (double.class.equals(primitiveType)) {
            return Double.class;
        }
        return null;
    }
}
